Yesterday I uploaded the first public release of Acme::Gosub to CPAN. This allows you to emulate BASIC's "GOSUB" and "RETURN" statements in Perl. It all started a long time ago when I thought that Perl's "goto EXPR" statement was powerful enough to emulate goto, by keeping a stack of labels, and where RETURN would be something like goto pop(@labels).
Then I came to the idea of writing a module to do it. I searched CPAN for gosub but couldn't find anything relevant so the coast was clear. However, I then got stucked up in a technicality. A few days ago, I was able to find a way to resolve it, and so set down to write the module.
I started from Switch.pm which I knew utilized a code filter. My needs were simpler except for trying to have a "gosub EXPR;" as a statement, for which I tricked Text::Balanced into doing it by prepending a leading semicolon and then asking to find a match code-block that was delimited by semi-colons. (it's a kludge, but it works).
I finished it in one afternoon, and then uploaded it. It has a nice test-suite with some funky functions that make use of gosub. At the moment, it has some glaring bugs and limitations, but hopefully they will be resolved in a future work.
So now I give you the Acme::Gosub JAPH:
#!/usr/bin/perl use strict; use warnings; use Acme::Gosub; my @japh = ("Just another", " Perl", " and Acme::Gosub", " Hacker\n"); sub print_japh { my $print_me; $print_me = $japh[0]; gosub PRINT; $print_me = $japh[1]; gosub PRINT; $print_me = $japh[2]; gosub PRINT; $print_me = $japh[3]; gosub PRINT; return; PRINT: print $print_me; greturn; } print_japh();